1.5 getAST——Syntax Tree, Generate!中文版
中文本为初稿,更新版本请参阅英文版
在 Fasta 解析器中,getAST
方法用于抽象语法树生成。
注:位于 pkg\front_end\lib\src\fasta\util\parser_ast.dart
。
getAST
方法接收到 Dart 源码的字节流,首先创建 Utf8BytesScanner 进行 tokenize
操作。与第一节相同,不再赘述。
之后,会创建一个 Listener 以及创建一个 Parser,他俩都是第二节中铺垫的东东,在这里对应起来。
核心代码如下:
// tokenize,返回第一个 token
Token firstToken = scanner.tokenize();
// 创建 Listener
ParserASTListener listener = new ParserASTListener();
// 创建 Parser
Parser parser = new Parser(
listener,
//...省略其它参数
);
// 触发 Parser 解析,以第一个 token 作为开始
parser.parseUnit(firstToken);
// 返回抽象语法树
return listener.data.single as CompilationUnitEnd;
在上面的代码中,Parser 只负责分析 Token,识别出各种事件,向 Listener 发出通知。
抽象语法树实际上是在 ParserASTListener 中被生成的。ParserASTListener 继承自 Listener,实现了各个通知方法,在各个方法中,ParserASTListener 通过自身的解析规则,一步步构建出 AST。
最终,构建出的 AST 保存在 listener.data
属性中,作为返回值返回。
再回顾一下第四节中的 viewer.dart
,它的核心逻辑如下:
// 读取源代码文件
Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
// 构建 AST
ParserAstNode ast = getAST(bytes,
enableExtensionMethods: true);
// 构建 TUI 应用
Widget widget = new QuitOnQWidget(
new WithSingleLineBottomWidget(
new BoxedWidget(
// 专门负责展示 AST 的组件
new AstWidget(ast),
),
new StatusBarWidget(),
),
);
Application app = new Application(widget);
// 运行 TUI 应用
app.start();
本文作者:Maeiee
本文链接:1.5 getAST——Syntax Tree, Generate!中文版
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!